Trong C++, mọi biểu thức đều cho ra một trong hai loại lvalue hoặc một rvalue. Sự phân biệt này xác định xem một biểu thức có đề cập đến nhận diện (ở đâu) hay giá trị của nó giá trị (điều mà nó chứa đựng).
1. Nhận diện so với Nội dung
Một lvalue (giá trị vị trí) đại diện cho một đối tượng có địa chỉ bộ nhớ bền vững. Hãy hình dung nó như một hộp được đánh dấu trong RAM. Ngược lại, một rvalue (giá trị đọc) là tạm thời; nó đại diện cho một kết quả tạm thời hoặc một hằng số không có địa chỉ nào mà lập trình viên có thể truy cập được.
2. Chuyển tiếp chức năng
Mặc dù một lvalue có thể hoạt động như một rvalue (bộ biên dịch đơn giản lấy giá trị bên trong thùng), ngược lại thì bị cấm. Bạn không thể dùng một rvalue ở nơi yêu cầu một lvalue — ví dụ, bạn không thể lấy địa chỉ của một số hằng như &42 vì nó thiếu một nhận diện bền vững.
$$ \text{Lvalue} \xrightarrow{\text{Chuyển đổi}} \text{Rvalue} \quad (\text{Được phép}) $$
$$ \text{Rvalue} \xrightarrow{\text{Gán}} \text{Lvalue} \quad (\text{Không được phép}) $$